package com.passion.mq.publish;

import com.passion.mq.config.RabbitMqConfig;
import com.passion.mq.core.MqSender;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;

/**
 * 建类说明：rabbitmq发送者
 * 
 * 只有在开启了 rabbitmq 时才初始化此bean
 * 
 * @author 中国印
 * @since 2022年05月20日 01:34:41
 */
@Slf4j
@Component
@ConditionalOnBean(RabbitMqConfig.class)
public class RabbitMqSender implements MqSender {

    @Resource
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送消息到指定的主题/队列
     *
     * @param topicOrQueue 消息的目标主题或队列名称
     * @param message      要发送的消息内容
     */
    @Override
    public void sendMessage(String topicOrQueue, String message) {
        rabbitTemplate.convertAndSend(topicOrQueue, message);
    }

    /**
     * 发送带有额外属性的消息
     *
     * @param queue        消息队列名称
     * @param message      要发送的消息内容
     * @param properties   消息的附加属性（如头部信息）
     */
    @Override
    public void sendMessage(String queue, String message, Map<String, Object> properties) {
        rabbitTemplate.convertAndSend(queue, message, m -> {
            if (properties != null && !properties.isEmpty()) {
                for (Map.Entry<String, Object> entry : properties.entrySet()) {
                    String key = entry.getKey();
                    Object value = entry.getValue();
                    // 如果设置的属性中存在contentType，则设置消息内容类型
                    String contentTypeKey = "contentType";
                    if (contentTypeKey.equalsIgnoreCase(key)) {
                        // 设置message的内容类型
                        m.getMessageProperties().setContentType((String) value);
                    } else {
                        // 其他属性在header中设置
                        m.getMessageProperties().setHeader(key, value);
                    }
                }
            }
            return m;
        });
    }
}